﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Interfaces;
using HerGoS.DAO;
using HerGoS.Viaticos.Entities;
using System.Data;
using HerGoS.Viaticos.Exceptions;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Engine;

namespace HerGoS.Viaticos.Engine
{
   public class GestorTipoConcepto
    {

       public static TipoConcepto Obtener(int oid)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "TTIPOCONCEPTOS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", oid);
               DataTable dt = repo.ExecuteDataTable();
               TipoConcepto result = dt.ToGenericList<TipoConcepto>(TipoConceptoConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new TipoConceptoGetException(ex);
           }
       }

       public static List<TipoConcepto> Consultar()
       {
           return Consultar(null, null, true);

       }

       public static List<TipoConcepto> Consultar(string codigo, string descripcion, bool? activo)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "TTIPOCONCEPTOS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@CODIGO", codigo);
               repo.AddParameter("@DESCRIPCION", descripcion);
               repo.AddParameter("@ACTIVO", activo);
               DataTable dt = repo.ExecuteDataTable();
               List<TipoConcepto> result = dt.ToGenericList<TipoConcepto>(TipoConceptoConverter);
               return result;
           }
           catch (Exception ex)
           {
               throw new TipoConceptoGetException(ex);
           }
       }

       public static void Guardar(TipoConcepto tipoConcepto)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
               repo.Nombre = "TTIPOCONCEPTOS_PROC";
               repo.AddParameter("@ACCION ", tipoConcepto.Persistencia);
               repo.AddParameter("@ID", tipoConcepto.OID);
               repo.AddParameter("@CODIGO", tipoConcepto.Codigo);
               repo.AddParameter("@DESCRIPCION", tipoConcepto.Descripcion);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               tipoConcepto.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

               GestorBitacora.Guardar(tipoConcepto);
           }
           catch (Exception ex)
           {
               throw new TipoConceptoSaveException(ex);
           }
       }

       public static void Eliminar(TipoConcepto tipoConcepto)
       {
           tipoConcepto.Persistencia = EstadoPersistencia.DELETE;
           Guardar(tipoConcepto);
           tipoConcepto.Persistencia = EstadoPersistencia.UPDATE;
           tipoConcepto.Activo = false;
       }


       public static void ReActivar(TipoConcepto tipoConcepto)
       {
           tipoConcepto.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(tipoConcepto);
           tipoConcepto.Persistencia = EstadoPersistencia.UPDATE;
           tipoConcepto.Activo = true;
       }




       #region Converter
       public static TipoConcepto TipoConceptoConverter(DataRow row)
       {
           return new TipoConcepto
           {
               OID = row["tconID"].ToInteger(),
               Codigo = row["tconCODIGO"].ToString(),
               Descripcion = row["tconDESCRIPCION"].ToString(),
               Persistencia = EstadoPersistencia.UPDATE,
               Activo = row.IsNull("FECHA_BAJA") ? true : false
           };
       }
       #endregion

    }
}
